import random
import string

def generate_secure_password(length = 16):
    """生成安全的随机密码（适用于Windows/Linux/数据库）"""
    # 定义字符集（排除不建议的特殊字符）
    lowercase = string.ascii_lowercase  # a-z
    uppercase = string.ascii_uppercase  # A-Z
    digits = string.digits              # 0-9
    safe_special_chars = "@*_+-=.?,;[]^{}~"  # 允许的安全特殊字符

    # 确保密码包含至少 3 种字符类型（大小写字母、数字、特殊字符）
    required_char_sets = [lowercase, uppercase, digits]
    password = []

    # 随机选择至少 3 种字符类型（确保多样性）
    selected_char_sets = random.sample(required_char_sets, k=3)

    # 50% 概率加入特殊字符
    if random.choice([True, False]):
        selected_char_sets.append(safe_special_chars)

    # 从每个选中的字符集中随机选 1 个字符（确保至少包含）
    for char_set in selected_char_sets:
        password.append(random.choice(char_set))

    # 剩余字符从所有选中的字符集中随机选择
    remaining_length = length - len(password)
    all_chars = ''.join(selected_char_sets)
    password.extend(random.choices(all_chars, k=remaining_length))

    # 打乱密码顺序（避免前几位固定是特定字符类型）
    random.shuffle(password)

    return ''.join(password)

def update_next_password(userdata):
    """
    更新用户数据中的 next_passwd 字段
    
    Args:
        userdata: 原始用户数据列表（每个元素是一个字典，必须包含 'id' 字段）
    
    Returns:
        处理后的数据列表，格式为 [{'id': ..., 'user': {...}}, ...]
    
    Raises:
        ValueError: 如果输入数据为空或缺少 'id' 字段
    """
    if not userdata:
        raise ValueError("Input userdata cannot be empty.")
    
    processed_data = []
    for user in userdata:
        
        # 提取 id 并复制剩余数据
        user_id = user['id']
        user_copy = user.copy()
        user_copy.pop('id')
        user_copy.pop('server_ip')

        # 生成新密码并更新字段
        user_copy['next_passwd'] = generate_secure_password()

        # 添加到结果列表
        processed_data.append((user_id, user_copy))
    
    return processed_data